home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 5
/
Gekikoh Dennoh Club Vol. 5 (Japan).7z
/
Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin
/
docs
/
rakup
/
match02.doc
< prev
next >
Wrap
Lisp/Scheme
|
1998-10-03
|
18KB
|
605 lines
ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬
(MATCH02.DOC)
é¿ïCèyé▓é¡éτé¡âvâìâOâëâ~âôâOôⁿûσ ö╘èOò╥ üuâGâLâXâpü[âgâVâXâeâÇé╠ì∞ɼüv
ìLêΣü@É╜
ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬ä¬
ü¢âåâjâtâBâPü[âVâçâô
â}âbâ`âôâOé═âpâ^ü[âôé╞âfü[â^é≡Å╞ìçé╖éΘéαé╠é┼é╡é╜üBìíôxé═üAâpâ^ü[âôé╞âp
â^ü[âôé≡Å╞ìçé╖éΘüuâåâjâtâBâPü[âVâçâô(unification)üv[*2] é≡ì∞é┴é─é▌é▄é╖üB
âpâ^ü[âôò╧Éöé╞âpâ^ü[âôò╧Éöé≡Å╞ìçé╖éΘò¬é╛é»üAmatch éµéΦéαÅêù¥é═òíÄGé╔é╚éΦ
é▄é╖üBâpâ^ü[âôâ}âbâ`âôâOé╠ë₧ùpé┼é═üAmatch é┼Å\ò¬é╚ÅΩìçéαéáéΦé▄é╖é¬üAé▒é╠
îπé┼ì∞ɼé╖éΘ Prolog òùé╠è╚ê╒âGâLâXâpü[âgâVâXâeâÇé┼é═üAâåâjâtâBâPü[âVâçâô
é¬òKùvé╔é╚éΦé▄é╖üBè╓Éöû╝é═ unify é╞é╡é▄é╖üBăé╠Ä└ìsùßé≡î⌐é─é¡é╛é│éóüB
Lisp > (unify '(æ╛ÿY ìDé½ âRü[âqü[) '(æ╛ÿY ìDé½ X) nil)
((X . âRü[âqü[))
Lisp > (unify '(æ╛ÿY ìDé½ âRü[âqü[) '(æ╛ÿY Y âRü[âqü[) nil)
((Y . ìDé½))
Lisp > (unify '(ë╘Äq ìDé½ ìgÆâ) '(ë╘Äq X Y) nil)
((Y . ìgÆâ) (X . ìDé½))
match é┼é═æµ 2 ê°Éöé╔âpâ^ü[âôé≡ù^éªéΘé▒é╞é═é┼é½é▄é╣é±é¬üAunify é═âpâ^ü[
âôé┼éαé⌐é▄éóé▄é╣é±üBunify é═ match é╞ô»ùlé╔üAɼî≈é╡é╜ÅΩìçé═æ⌐ö¢âèâXâgé≡
ò╘é╡üAÄ╕ösé╡é╜ÅΩìçé═ fail é≡ò╘é╡é▄é╖üB
ăé═üAâåâjâtâBâPü[âVâçâôé╠ô┴ÆÑôIé╚ùßé≡Īé╡é▄é╡éσéñüB
Lisp > (unify '(ë╘Äq X Y) '(ë╘Äq A B) nil)
((X . A) (Y . B))
Lisp > (unify '(ë╘Äq X Y) '(ë╘Äq X Y) nil)
((X . X) (Y . Y))
âåâjâtâBâPü[âVâçâôé┼é═üAâpâ^ü[âôò╧Éöé╠Ælé¬âpâ^ü[âôò╧Éöé╔é╚éΘé▒é╞éαéáéΦé▄
é╖üBì┼îπé╠ùßé╠éµéñé╔üAÄ⌐ò¬Ä⌐Égé¬Ælé╞é╚éΘÅΩìçéαéáéΦé▄é╖üBé▒é╠éµéñé╚ÅΩìçé┼
éαüAâåâjâtâBâPü[âVâçâôé═ɼî≈é╖éΘé╠é┼é╖üB
note:
[*2] ĽÅæé≡ê°é¡é╞üAô¥êΩë╗üAÆPêΩë╗é╞éóéñê╙ûíé┼é╖é¬üAé▒éΩé╛é»é┼é═éµé¡éφé⌐
éΦé▄é╣é±é╦üBé▒é▒é┼é═üAâpâ^ü[âôô»Ämé╠â}âbâ`âôâOé¬âåâjâtâBâPü[âVâçâô
é╞ìléªé─é¡é╛é│éóüB
é╗éΩé┼é═ unify é≡ì∞é┴é─éóé½é▄é╡éσéñüBÅêù¥é═ match é╞é┘é┌ô»é╢é┼é╖é¬üAæµ
2 ê°Éöé╔éαâpâ^ü[âôò╧Éöé¬è▄é▄éΩéΘé╜é▀üAé╗é╠Åêù¥é≡Æ╟ë┴é╖éΘé▒é╞é╔é╚éΦé▄é╖üB
List 8 : âåâjâtâBâPü[âVâçâô
1 (defun unify (pattern datum binding)
2 (cond ((variablep pattern)
3 (unify-variable pattern datum binding))
4 ((variablep datum)
5 (unify-variable datum pattern binding))
6 ((and (atom pattern) (atom datum))
7 (unify-atoms pattern datum binding))
8 ((and (consp pattern) (consp datum))
9 (unify-pieces pattern datum binding))
10 (t 'fail)))
4 ìsû┌é┼üAdatum é¬âpâ^ü[âôò╧Éöé⌐â`âFâbâNé╖éΘÅêù¥é≡Æ╟ë┴é╡é─éóé▄é╖üBunify-
atoms é╞ unify-pieces é═ match é≡ unify é╔Æué½è╖éªé╜é╛é»é┼üAmatch-atoms
é╞ match-pieces é╞ô»é╢é┼é╖üB
List 9 : âAâgâÇé╞é╠âåâjâtâBâPü[âVâçâô
1 (defun unify-atoms (pattern datum binding)
2 (if (equal pattern datum) binding 'fail))
List 10 : âèâXâgé╠âåâjâtâBâPü[âVâçâô
1 (defun unify-pieces (pattern datum binding)
2 (let ((result (unify (car pattern) (car datum) binding)))
3 (if (eq result 'fail)
4 'fail
5 (unify (cdr pattern) (cdr datum) result))))
unify-variable é═ match-variable é╞Åêù¥é¬ê┘é╚éΘë╙Åèé¬éáéΦé▄é╖üBâåâjâtâB
âPü[âVâçâôé╠ÅΩìçüAâpâ^ü[âôò╧Éöé╞âpâ^ü[âôò╧Éöé═êΩÆvé╡é▄é╖é¬üAâpâ^ü[âôò╧Éö
é╞é╗éΩé╞ô»é╢âpâ^ü[âôò╧Éöé≡è▄é▐âpâ^ü[âôé╞é═êΩÆvé╡é╚éóé⌐éτé┼é╖üBăé╠ùßé≡î⌐
é─é¡é╛é│éóüB
Lisp > (unify '(æ╛ÿY ìDé½ X) '(æ╛ÿY ìDé½ (âRü[âqü[ âuâëâbâN)) nil)
((X âRü[âqü[ âuâëâbâN))
Lisp > (unify '(æ╛ÿY ìDé½ (âRü[âqü[ X))
'(æ╛ÿY ìDé½ (âRü[âqü[ âuâëâbâN)) nil)
((X . âuâëâbâN))
Lisp > (unify '(æ╛ÿY ìDé½ X) '(æ╛ÿY ìDé½ (âRü[âqü[ X)) nil)
fail
âRü[âqü[é╠Äφù▐é≡âèâXâgé┼ò\é╖é▒é╞é╔é╡é▄é╡é╜üBì┼Åëé╠ùßé┼é═üAX é═ (âRü[âqü[
âuâëâbâN) é╞é╚éΦé▄é╖üB2 ö╘û┌é╠ùßé┼é═üAX é═âuâëâbâNé╞é╚éΦüAâRü[âqü[é╠Äφù▐
é≡ïüé▀éΘé▒é╞é¬é┼é½é▄é╖üBé╗éΩé┼é═üAì┼îπé╠ùßé═é╟éñé╚éΘé╠é┼é╡éσéñé⌐üBX é╞
(âRü[âqü[ X) é≡Å╞ìçé│é╣éΘé▒é╞é╔é╚éΦé▄é╖üBé▒é╠ÅΩìçüAì┼Åëé╠ X é═æ╛ÿYé¬ìDé½
é╚éαé╠é≡ò\é╡é─éóéΘé╠é╔üAăé╠ X é═âRü[âqü[é╠Äφù▐é≡ò\é╖é▒é╞é╔é╚éΦüAû╡Åéé╡
é─é╡é▄éóé▄é╖üBé╡é╜é¬é┴é─üAX é╞ (âRü[âqü[ X) é═òsêΩÆvé╞ö╗ÆΦé╡é╚é¡é─é═éóé»
é╚éóé╠é┼é╖üB
é╗éΩé┼é═üAunify-variable é≡ì∞éΦé▄é╖üBâpâ^ü[âôò╧Éöé╞Ælé≡æ⌐ö¢âèâXâgé╔Æ╟
ë┴é╖éΘÄ₧é╔üAÆlé╠Æåé╔ô»é╢âpâ^ü[âôò╧Éöé¬é╚éóé▒é╞é≡èmöFé╡é▄é╖üBé▒é╠Åêù¥é≡
insidep é┼ìséóé▄é╖üB
List 11 : âpâ^ü[âôò╧Éöé╞é╠âåâjâtâBâPü[âVâçâô
1 (defun unify-variable (pattern datum binding)
2 (let ((value (assoc pattern binding)))
3 (if (and value
4 (not (eq pattern (cdr value))))
5 (unify (cdr value) datum binding)
6 (if (insidep pattern datum binding)
7 'fail
8 (add-binding pattern datum binding)))))
Ä└é═üAmatch-varibale é╞é╠êßéóé¬éαéñêΩé┬éáéΦé▄é╖üBâåâjâtâBâPü[âVâçâôé╠
ÅΩìçüAô»é╢âpâ^ü[âôò╧Éöô»Ämé╠Å╞ìçé═ɼî≈é╖éΘé╠é┼üAæ⌐ö¢âèâXâgé╠Æåé╔é═üAé╜é╞
éªé╬ (X . X) é╞éóéñâhâbâgæ╬é¬è▄é▄éΩéΘé▒é╞é¬éáéΦé▄é╖üBé▒é╠é╜é▀üAæ⌐ö¢âèâX
âgé⌐éτò╧Éöé╠Ælé≡ÆTé╡üAé╗éΩé≡Ägé┴é─ÆPÅâé╔ unify é≡ì─ïAî─é╤Åoé╡é╖éΘé╞ìóéΘ
é▒é╞é¬ïNé▒éΘé╠é┼é╖üBX é╠Ælé═ X é┼é╖é⌐éτüAô»é╢é▒é╞é≡é╕é┴é╞îJéΦò╘é╖é▒é╞é╔
é╚éΦé▄é╖üBé┬é▄éΦüAì─ïAî─é╤Åoé╡é¬ÆΓÄ~é╣é╕é╔üALisp âCâôâ^âvâèâ^é╠Ä└ìsé¬ÆΓ
Ä~é╡é▄é╖üBé▒éΩé≡ë±ö≡é╖éΘé╜é▀é╔üA4 ìsû┌é┼âpâ^ü[âôò╧Éöé╞é╗é╠Ælé¬ê┘é╚éΘé▒é╞
é≡èmöFé╡é─éóé▄é╖üB
6 ìsû┌é┼üAæ⌐ö¢âèâXâgé╔âpâ^ü[âôò╧Éöé╞Ælé≡Æ╟ë┴é╖éΘæOé╔üAinsidep é≡î─é╤Åo
é╡é─üAô»é╢âpâ^ü[âôò╧Éöé¬Ælé╠Æåé┼ÄgéφéΩé─éóé╚éóé⌐â`âFâbâNé╡é▄é╖üBé╗éΩé┼é═üA
insidep é≡ì∞éΦé▄é╡éσéñüB
List 12 : datum é╠Æåé╔ var(âpâ^ü[âôò╧Éö)é¬éáéΘé⌐
1 (defun insidep (var datum binding)
2 (if (eq var datum)
3 nil
4 (inside-sub-p var datum binding)))
Ä└ì█é╠Åêù¥é═ inside-sub-p é┼ìséóé▄é╖üBâåâjâtâBâPü[âVâçâôé═ô»é╢âpâ^ü[âô
ò╧Éöô»Ämé╠Å╞ìçé┼éáéΩé╬ɼî≈é╡é▄é╖üB2 ìsû┌é╠ if é┼üAvar é╞ datum é¬ô»é╢âp
â^ü[âôò╧Éöé⌐â`âFâbâNé╡é─éóé▄é╖üB
List 13 : insidep û{æ╠
1 (defun inside-sub-p (var datum binding)
2 (cond ((equal var datum) t)
3 ((atom datum) nil)
4 ((variablep datum)
5 (let ((value (assoc datum binding)))
6 (if value
7 (inside-sub-p var (cdr value) binding))))
8 (t
9 (or (inside-sub-p var (car datum) binding)
10 (inside-sub-p var (cdr datum) binding)))))
inside-sub-p é═âèâXâgé≡ car é╞ cdr é┼ò¬ë≡é╡é╚é¬éτüAâpâ^ü[âôò╧Éö var é≡
â`âFâbâNé╡é─éóé½é▄é╖üB2 ìsû┌é┼üAvar é╞ datum é¬ôÖé╡éóé╠é┼éáéΩé╬üAâfü[â^
é╠Æåé╔ô»é╢âpâ^ü[âôò╧Éöé≡î⌐é┬é»é╜é╠é┼ t é≡ò╘é╡é▄é╖üB3 ìsû┌é┼üAdatum é¬âA
âgâÇé┼éáéΩé╬üAé▒éΩê╚Åπò¬ë≡é┼é½é╚éóé╠é┼ nilé≡ò╘é╡é▄é╖üB4 ìsû┌é┼üAdatum é¬
âpâ^ü[âôò╧Éöé╠ÅΩìçüAé╗é╠Ælé╔ var é¬è▄é▄éΩé─éóéΘé⌐â`âFâbâNé╡é▄é╖üB5 ìsû┌
é┼üAæ⌐ö¢âèâXâgé⌐éτ datum é≡ÆTì⌡é╡é▄é╖üBÆlé¬î⌐é┬é⌐éΩé╬ inside-sub-p é≡ì─
ïAî─é╤Åoé╡é╡é▄é╖üBé╗éñé┼é╚é»éΩé╬ nil é≡ò╘é╡é▄é╖üB
é╗éΩê╚èOé╠ÅΩìçé═üAdatum é═âèâXâgé╚é╠é┼üAcar é╞ cdr é┼âèâXâgé≡ò¬ë≡é╡é─üA
inside-sub-p é≡ì─ïAî─é╤Åoé╡é╡é▄é╖üBò╧Éö var é¬î⌐é┬é⌐é┴é╜éτÆTì⌡é≡ÆåÆfé╡é─
t é≡ò╘é╣é╬éóéóé╠é┼üAor é≡Ägé┴é─éóéΘé▒é╞é╔Æìê╙é╡é─é¡é╛é│éóüBé┬é▄éΦ CAR òö
é≡Æ▓é╫é─é╜îïë╩é¬ t é╚éτé╬üAor é═ t é≡ò╘é╡é▄é╖é╡üAnil é┼éáéΩé╬ăé╠ CDR òö
é╠ÆTì⌡é¬ìséφéΩé▄é╖üB
é▒éΩé┼âvâìâOâëâÇé═è«É¼é┼é╖üBâvâìâOâëâÇé═ match é╞ô»é╢é¡üAMATCH.VL é╔èi
ö[é│éΩé─éóé▄é╖üBÄ└ì█é╔ô«ì∞é≡èmöFé╡é─é▌é─é¡é╛é│éóüB
ü¢éαéñêΩé┬é╠ò╧Éöè╟ù¥ò√û@
æ⌐ö¢âèâXâgé╔éµéΘè╟ù¥ò√û@é═üAâèâXâgÅêù¥é¬ô╛ê╙é╚ Lisp é┼éµé¡ÄgéφéΩéΘÄΦû@
é┼é╖é¬üAé▒é▒é┼ò╩é╠ò√û@é≡Å╨ëεé╡é▄é╡éσéñüBé╗éΩé═üAâpâ^ü[âôò╧Éöé≡ò\é╖âVâôâ{
âïé╔Ælé≡èiö[é╖éΘò√û@é┼é╖üBLisp é╠âVâôâ{âïé═Ælé≡èiö[é┼é½é▄é╖é¬üAé╗é╠ï@ö\
é═ï╟Åèò╧ÉöüiâîâLâVâJâïò╧Éöüjé╞æσêµò╧ÉöüiâXâyâVâââïò╧Éöüjé╔ò¬é⌐éΩé▄é╖üBìí
ë±é╠ò√û@é┼é═üAâVâôâ{âïé≡âXâyâVâââïò╧Éöé╞é╡é─Ägùpé╡é▄é╖üB
Lisp é╔é═üAâXâyâVâââïò╧Éöé╠Ælé≡æÇì∞é╖éΘè╓Éöé¬ùpê╙é│éΩé─éóé▄é╖üB
äíäƒäƒâVâôâ{âïäƒäƒäó set
boundp ü⌐äƒäƒäá âXâyâVâââïò╧Éö äáü⌐äƒäƒäƒ data
(æ⌐ö¢â`âFâbâN) äñäƒäƒäƒäƒäƒäƒäƒäƒäú ü¬
ü¬ äá symbol-value äá
äá äñäƒäƒäƒäƒäƒäƒäƒäƒäú
äá
makunbound (ûóæ⌐ö¢é╔é╖éΘ)
É} 5 : âXâyâVâââïò╧Éöé╠æÇì∞è╓Éö
âXâyâVâââïò╧Éöé╔é═üAÆlé¬âZâbâgé│éΩé─éóé╚éóÅΩìçé¬éáéΦé▄é╖üBé▒é╠Ä₧üAò╧Éö
é╔âAâNâZâXé╖éΘé╞âGâëü[é¬ö¡É╢é╡é▄é╖üBâVâôâ{âïé¬âXâyâVâââïò╧Éöé╠Ælé≡Ä¥é┴é─
éóéΘé⌐üAé┬é▄éΦæ⌐ö¢é│éΩé─éóéΘé⌐â`âFâbâNé╖éΘè╓Éöé¬ boundp é┼é╖üBâXâyâVâââï
ò╧Éöé╠Ælé≡Ä¥é╜é╚éóéµéñé╔é╖éΘüAé┬é▄éΦûóæ⌐ö¢Å≤æ╘é╔é╖éΘè╓Éöé¬ makunbound é┼
é╖üBÆlé≡âZâbâgé╖éΘè╓Éöé¬ set é┼üAÆlé≡ĵéΦÅoé╖è╓Éöé¬ symbol-value é┼é╖üB
é┼é═üAÅ┌é╡é¡Éαû╛é╡é▄é╡éσéñüB
boundp symbol
makunbound symbol
boundp é═ symbol é╠âXâyâVâââïò╧Éöé¬Ælé≡Ä¥é┴é─éóéΩé╬ t é≡ò╘é╡üAé╗éñé┼é╚
é»éΩé╬ nil é≡ò╘é╡é▄é╖üBmkunbound é═ symbol é╠âXâyâVâââïò╧Éöé≡ûóæ⌐ö¢é╔é╡
é▄é╖üBâXâyâVâââïò╧Éöé═Ælé≡Ä¥é╜é╚é¡é╚éΘé╠é┼üAò╧Éöé≡ò]ë┐é╖éΘé╞âGâëü[é╔é╚éΦ
é▄é╖üBmkunbound é═ûóæ⌐ö¢é╔é╡é╜âVâôâ{âïé≡ò╘é╡é▄é╖üB
è╚ÆPé╚Ägùpùßé≡Īé╡é▄é╡éσéñüB
Lisp > (boundp 'a)
nil
Lisp > (setq a 10)
10
Lisp > (boundp 'a)
t
Lisp > (makunbound 'a)
a
Lisp > (boundp 'a)
nil
âVâôâ{âï a é═Ælé¬âZâbâgé│éΩé─éóé▄é╣é±üBé▒é▒é┼ setq é┼ a é╔ 10 é≡âZâbâg
é╡é▄é╖üBa é═âîâLâVâJâïò╧Éöé┼é═é╚éóé╠é┼üAâXâyâVâââïò╧Éöé╔Ælé¬âZâbâgé│éΩé▄
é╖üBé╡é╜é¬é┴é─üAboundp é┼Æ▓é╫éΘé╞ t é≡ò╘é╡é▄é╖üBmakubound é┼ a é≡ûóæ⌐ö¢
Å≤æ╘é╔é╖éΘé╞üAboundp é═ nil é≡ò╘é╡é▄é╖üB
set symbol value
symbol-value symbol
set é═ symbol é╠âXâyâVâââïò╧Éöé╠Ælé≡ value é╔ò╧ìXé╡é▄é╖üBset é═è╓Éöé╚
é╠é┼ symbol é═ò]ë┐é│éΩé▄é╖üBò]ë┐îïë╩é¬âVâôâ{âïé┼é╚é»éΩé╬âGâëü[é╞é╚éΦé▄é╖üB
set é═âîâLâVâJâïò╧Éöé╠Ælé≡ò╧ìXé┼é½é▄é╣é±üBset é═ value é≡ò╘é╡é▄é╖üB
symbol-value é═ symbol é╠âXâyâVâââïò╧Éöé╠Ælé≡ĵéΦÅoé╡é▄é╖üBset é╞ô»é╢
é¡üAâîâLâVâJâïò╧Éöé╔é═âAâNâZâXé┼é½é▄é╣é±üBè╚ÆPé╚Ägùpùßé≡Īé╡é▄é╡éσéñüB
Lisp > (set 'a 10)
10
Lisp > (let ((a 100))
(print (symbol-value 'a))
(set 'a 20)
(print a))
10
100
Lisp > a
20
é▄é╕ set é┼âVâôâ{âï a é╠âXâyâVâââïò╧Éöé╔ 10 é≡âZâbâgé╡é▄é╖üBăé╔üAlet
é┼âîâLâVâJâïò╧Éö a é≡ 100 é╔É▌ÆΦé╡é▄é╖üBsymbol-value é┼ a é╠Ælé≡ĵéΦÅoé╖
é╞üAâXâyâVâââïò╧Éöé╠Æl 10 é╞é╚éΦé▄é╖üBăé╔üAset é┼ a é╠Ælé≡ 20 é╔ò╧ìXé╡
é▄é╖üBé▒é╠ÅΩìçüAâXâyâVâââïò╧Éöé╠Ælé≡ò╧ìXé╖éΘé╠é┼üAa é╠Ælé≡ print é╡é─éα
100 é╠é▄é▄é┼é╖üBlet é╠Ä└ìsîπüAa é≡ò\Īé╖éΘé╞ 20 é╔ò╧ìXé│éΩé─éóé▄é╖üB
âpâ^ü[âôâ}âbâ`âôâOé╠ò╧Éöè╟ù¥é╔âXâyâVâââïò╧Éöé≡ÄgéñÅΩìçüAæ⌐ö¢üEûóæ⌐ö¢é╠
Å≤æ╘é≡üAé╗é╠é▄é▄âpâ^ü[âôò╧Éöé╔ôûé─é═é▀éΘé▒é╞é¬é┼é½éΘé╠é┼ò╓ùÿé╚é╠é┼é╖üBé╜
é╛é╡üAâXâyâVâââïò╧Éöé╠Ælé≡ò╧ìXé╖éΘé╞üAé╗é╠ëeï┐é═é╕é┴é╞ÄcéΘé╠é┼üAâpâ^ü[âô
â}âbâ`âôâOÅIù╣îπé═üAûóæ⌐ö¢Å≤æ╘é╔û▀é╡é─é¿é¡òKùvé¬éáéΦé▄é╖üBé╡é╜é¬é┴é─üAÿA
æzâèâXâgé╠ÅΩìçé╞ô»é╢éµéñé╔üAâåâjâtâBâPü[âVâçâôé¬É¼î≈é╡é╜Ä₧é═üAæ⌐ö¢é╡é╜ò╧
Éöé╠âèâXâgé≡ò╘é╡üAÄ╕ösé╡é╜Ä₧é═ fail é≡ò╘é╖é▒é╞é╔é╡é▄é╖üB
é╗éΩé┼é═üAâXâyâVâââïò╧Éöé≡Ägé┴é╜è╟ù¥ò√û@é┼âåâjâtâBâPü[âVâçâôé≡Ä└î╗é╡é─
é▌é▄é╡éσéñüBé▄é╕üAâpâ^ü[âôò╧Éöé≡æ⌐ö¢é╖éΘ add-binding é⌐éτÅCÉ│é╡é▄é╖üB
List 14 : ò╧ÉöÆlé≡âZâbâgé╖éΘ
1 (defun add-binding (var datum binding)
2 (set var datum)
3 (cons var binding))
Ælé╠âZâbâgé═ set é≡Ägéªé╬è╚ÆPé┼é╖üBset é═è╓Éöé╚é╠é┼ê°Éöé═ò]ë┐é│éΩéΘé▒
é╞é╔Æìê╙é╡é─é¡é╛é│éóüBvar é╔âZâbâgé│éΩé─éóéΘâVâôâ{âïé╠âXâyâVâââïò╧Éöé╔
datum é╠Ælé¬âZâbâgé│éΩé▄é╖üBì┼îπé╔ binding é╔ò╧Éö var é≡Æ╟ë┴é╡é▄é╖üB
ăé═üAæ⌐ö¢é│éΩé╜ò╧Éöé≡âNâèâAé╖éΘè╓Éö clear-binding é≡ì∞éΦé▄é╖üB
List 15 : ò╧Éöé≡âNâèâAé╡é─ 'fail é≡ò╘é╖
1 (defun clear-binding (binding)
2 (if (consp binding)
3 (map nil #'makunbound binding))
4 'fail)
binding é¬âèâXâgé┼éáéΩé╬üAé╗é▒é╔èiö[é│éΩé─éóéΘò╧Éöé≡ makunbound é┼ûóæ⌐
ö¢é╔é╡é▄é╖üBù±è╓Éö map é≡Ägé┴é─üAèeùvæfé╔ makunbound é≡ôKùpé╡é─éóé▄é╖üB
ì┼îπé╔ fail é≡ò╘é╡é▄é╖üB
é╗éΩé┼é═üAâåâjâtâBâPü[âVâçâôé≡ÅCÉ│é╡é▄é╡éσéñüBòsêΩÆvé╞ö╗ÆΦé╖éΘÅêù¥é┼üA
ìíé▄é┼æ⌐ö¢é│éΩé╜âpâ^ü[âôò╧Éöé≡ûóæ⌐ö¢é╔é╖éΘé╜é▀üAclear-binding é≡î─é╤Åoé╖
éµéñé╔é╡é▄é╖üBì┼Åëé═ unify é┼é╖üB
List 16 : âåâjâtâBâPü[âVâçâô
1 (defun unify (pattern datum binding)
2 (cond ((variablep pattern)
3 (unify-variable pattern datum binding))
4 ((variablep datum)
5 (unify-variable datum pattern binding))
6 ((and (atom pattern) (atom datum))
7 (unify-atoms pattern datum binding))
8 ((and (consp pattern) (consp datum))
9 (unify-pieces pattern datum binding))
10 (t (clear-binding binding))))
ì┼îπé╠É▀é┼ fail é≡ò╘é╖é╠é┼é╖é¬üAclear-binding é≡î─é╤Åoé╡é─ò╧Éöæ⌐ö¢é≡âN
âèâAé╡é▄é╖üB
List 17 : âAâgâÇé╞é╠âåâjâtâBâPü[âVâçâô
1 (defun unify-atoms (pattern datum binding)
2 (if (equal pattern datum)
3 binding
4 (clear-binding binding)))
unify-atoms é═ pattern é╞ datum é¬ôÖé╡é¡é╚éóÅΩìçüAclear-binding é≡î─é╤
Åoé╡üAò╧Éöé≡ûóæ⌐ö¢é╔é╡é─é⌐éτ fail é≡ò╘é╡é▄é╖üB
âèâXâgé╠âåâjâtâBâPü[âVâçâô unify-pieces é═üAÅCÉ│é╠òKùvé═éáéΦé▄é╣é±üB
ăé═ unify-variable é≡ò╧ìXé╡é▄é╖üB
List 18 : âpâ^ü[âôò╧Éöé╞é╠âåâjâtâBâPü[âVâçâô
1 (defun unify-variable (var datum binding)
2 (if (and (boundp var)
3 (not (eq (symbol-value var) var)))
4 (unify (symbol-value var) datum binding)
5 (if (insidep var datum binding)
6 (clear-binding binding)
7 (add-binding var datum binding))))
unify-varibale é═âpâ^ü[âôò╧Éöé╠Ælé≡ïüé▀éΘÅêù¥é≡ÅCÉ│é╡é▄é╖üBé▄é╕ boundp
é┼âXâyâVâââïò╧Éöé╔Ælé¬âZâbâgé│éΩé─éóéΘé▒é╞é≡èmöFé╡é▄é╖üBăé╔üAé╗é╠Ælé¬Ä⌐
ò¬Ä⌐Égé┼é╚éóé▒é╞é≡èmöFé╡é▄é╖üBé╜é╞éªé╬üAX é╞ X é≡Å╞ìçé╖éΘé╞Ä⌐ò¬Ä⌐Égé¬Æl
é╞é╚éΘé╜é▀üAé▒é╠â`âFâbâNé≡Å╚é¡é╞É│Åφé╔ô«ì∞é╡é▄é╣é±üBò╧Éöé¬æ⌐ö¢é│éΩé─éóéΩ
é╬üAÆlé≡ĵéΦÅoé╡é─ì─ôx unify é≡î─é╤Åoé╡é▄é╖üBûóæ⌐ö¢é╠ÅΩìçé═üAò╧Éö var é¬
datum ôαé┼ÄgéφéΩé─éóé╚éóé▒é╞é≡èmöFé╡é▄é╖üBÄgéφéΩé─éóéΩé╬üAclear-binding
é┼æ⌐ö¢é≡âNâèâAé╡é─ failé≡ò╘é╡é▄é╖üB
insidep é═é╗é╠é▄é▄é┼éóéóé╠é┼é╖é¬üAinside-sub-p é≡ÅCÉ│é╡é▄é╖üB
List 19 : datum é╠Æåé╔ var(ò╧Éö)é¬éáéΘé⌐
1 (defun inside-sub-p (var datum binding)
2 (cond ((equal var datum) t)
3 ((atom datum) nil)
4 ((variablep datum)
5 (if (and (boundp datum)
6 (not (eq (symbol-value datum) datum)))
7 (inside-sub-p var (symbol-value datum) binding)))
8 (t
9 (or (inside-sub-p var (car datum) binding)
10 (inside-sub-p var (cdr datum) binding)))))
11
4 ìsû┌é╠ datum é¬âpâ^ü[âôò╧Éöé╠ÅΩìçüAÆlé≡ĵéΦÅoé╖Åêù¥é≡ò╧ìXé╡é▄é╖üBò╧
Éö datum é¬æ⌐ö¢é│éΩé─éóé─üAé╗é╠Ælé¬Ä⌐ò¬Ä⌐Égé┼é╚éóé▒é╞é≡èmöFé╡é▄é╖üB
é▒éΩé┼ÅCÉ│é═ÅIéφéΦé▄é╡é╜é¬üAé▒é╠é▄é▄é╛é╞ unify é═ò╧ÉöâèâXâgé≡ò╘é╖é╛é»
é┼üAé╗é╠Ælé≡î⌐éΘé▒é╞é¬é┼é½é▄é╣é±üBé╗é▒é┼üAâpâ^ü[âôò╧Éöé⌐éτÆlé≡ïüé▀éΘè╓Éö
é≡ì∞éΦé▄é╖üB
List 20 : âpâ^ü[âôò╧Éöé╠Ælé≡ïüé▀éΘ
1 (defun variable-value (var)
2 (let (value)
3 (loop
4 (unless (boundp var) (return var))
5 (setq value (symbol-value var))
6 (cond
7 ((eq var value)
8 (return value))
9 ((variablep value)
10 (setq var value))
11 ((consp value)
12 (return (replace-variable value)))
13 (t (return value))))))
variable-value é═ò╧Éöé╠âèâôâPü[âWé≡é╜é╟é┴é─Ælé≡ïüé▀é▄é╖üBé▒é╠Åêù¥é═ì─
ïAÆΦï`é≡Ägéφé╚é¡é─éαüAîJéΦò╘é╡é┼Ä└î╗é┼é½é▄é╖üBé▄é╕ 4 ìsû┌é┼üAò╧Éö var é¬
Ä⌐ùRò╧Éöé┼éáéΩé╬üAé╗é╠ò╧Éöé≡é╗é╠é▄é▄ò╘é╡é▄é╖üBâåâjâtâBâPü[âVâçâôé═âpâ^ü[
âôò╧Éöô»Ämé╠Å╞ìçé¬ë┬ö\é╚é╠é┼üAéáéΘò╧Éöé¬ûóæ⌐ö¢é╠é▄é▄é╞éóéñé▒é╞éαéáéΘé╠é┼
é╖üB5 ìsû┌é┼üAvar é╠Ælé≡ symbol-value é┼ĵéΦÅoé╡ value é╔âZâbâgé╡é▄é╖üB
6 ìsû┌é⌐éτé╠ cond é┼üAÆl value é≡â`âFâbâNé╡é▄é╖üBéαé╡üAvar é╞ value é¬
ô»é╢âVâôâ{âïé┼éáéΩé╬üAÄ⌐ò¬Ä⌐Égé¬Ælé╞é╡é─èiö[é│éΩé─éóé▄é╖üBé▒é╠ÅΩìçé═üAé╗
é╠âVâôâ{âïé≡ return é┼ò╘é╡é▄é╖üBăé╔ value é¬âpâ^ü[âôò╧Éöé╠ÅΩìçé═üAvalue
é≡ var é╔âZâbâgé╡é─îJéΦò╘é╡é≡æ▒ìsé╡é▄é╖üBé▒éΩé┼üAò╧Éöè╘é╠âèâôâPü[âWé≡é╨
é╞é┬é╜é╟é┴é╜é▒é╞é╔é╚éΦé▄é╖üB
11 ìsû┌é┼üAvalue é¬âèâXâgé╠ÅΩìçé═üAé╗é╠Æåé╔éáéΘò╧Éöé≡Æuè╖é╖éΘé╜é▀üA
replace-variable é≡î─é╤Åoé╡üAé╗é╠îïë╩é≡ return é┼ò╘é╡é▄é╖üBì┼îπé╠ t É▀é┼
é═üAvalue é≡é╗é╠é▄é▄ return é┼ò╘é╖é╛é»é┼é╖üB
ăé═üAâèâXâgôαé╠âpâ^ü[âôò╧Éöé≡é╗é╠Ælé┼Æuè╖é╖éΘ replace-variable é┼é╖üB
List 21 : âpâ^ü[âôò╧Éöé≡Æuè╖é╖éΘ
1 (defun replace-variable (pattern)
2 (cond
3 ((variablep pattern)
4 (variable-value pattern))
5 ((atom pattern) pattern)
6 (t
7 (cons (replace-variable (car pattern))
8 (replace-variable (cdr pattern))))))
ì─ïAé≡Ägéªé╬è╚ÆPé╔ì∞éΩé▄é╖üB6 ìsû┌é┼üAâèâXâg é≡ car é╞ cdr é┼ò¬ë≡é╡üA
repalce-varibale é≡ì─ïAî─é╤Åoé╡é╡é▄é╖üBé╗é╡é─üAé╗é╠ò╘éΦÆlé≡ cons é┼ægé▌
ùºé─éΩé╬éµéóéφé»é┼é╖üB
ì─ïAî─é╤Åoé╡é╠ÆΓÄ~Å≡îÅé═ pattern é¬ atom é╠ÅΩìçé┼é╖é¬üAé╗é╠æOé╔ pattern
é¬âpâ^ü[âôò╧Éöé⌐â`âFâbâNé╡é▄é╖üBé╗é╠ÅΩìçé═ variable-value é┼Ælé≡ïüé▀üAé╗
é╠îïë╩é≡ò╘é╖éµéñé╔é╡é▄é╖üBé▒éΩé┼üAò╧Éöé≡é╗é╠Ælé╔Æué½è╖éªéΘé▒é╞é¬é┼é½é▄é╖üB
é▒éΩé┼âvâìâOâëâÇé═è«É¼é┼é╖üBìíë±ì∞ɼé╖éΘè╚ê╒âGâLâXâpü[âgâVâXâeâÇé┼é═üA
é╟é┐éτé╠âåâjâtâBâPü[âVâçâôé≡Ägé┴é─éαéµéóé╠é┼é╖é¬üAâpâ^ü[âôò╧Éöé╞âpâ^ü[âô
ò╧Éöé¬òíÄGé╔âèâôâNé╖éΘÅ≤ï╡üAé┬é▄éΦüAéáéΘò╧Éöé╠Ælé≡ïüé▀éΘé╠é╔òíÉöî┬é╠ò╧Éö
é≡é╜é╟éτé╚é»éΩé╬éóé»é╚éóÅΩìçé┼é═üAâXâyâVâââïò╧Éöé≡Ägé┴é╜è╟ù¥ò√û@é¬æ¼ôxôI
é╔ùDéΩé─éóé▄é╖üBé╚é║é⌐é╞éóéñé╞üAæ⌐ö¢âèâXâgé≡Ägéñé╞üAò╧Éöé╠Ælé≡ïüé▀éΘôxé╔üA
ÿAæzâèâXâgé╠ɵô¬é⌐éτÉⁿî`ÆTì⌡é╡é╚é»éΩé╬é╚éτé╚éóé⌐éτé┼é╖üBé▄é╜üAòíÉöî┬é╠ò╧
Éöé≡é╜é╟éΘé╞éóéñé▒é╞é═üAÿAæzâèâXâgé╔èiö[é│éΩé╜ùvæfÉöéαæ╜é¡é╚éΦüAöΣèrë±Éö
éαé╗éΩé╛é»æ¥éªéΘé▒é╞é╔é╚éΘé╠é┼é╖üBìíë±ì∞éΘâGâLâXâpü[âgâVâXâeâÇé┼é═üAâpâ^ü[
âôò╧Éöô»Ämé╠Å╞ìçé═òpö╔é╔ïNé▒éΘé╠é┼üAâåâjâtâBâPü[âVâçâôé═âXâyâVâââïò╧Éöé≡
Ägé┴é╜è╟ù¥ò√û@é┼Ä└î╗é╖éΘé▒é╞é╔é╡é▄é╡éσéñüB
âvâìâOâëâÇé═âtâ@âCâï UNIFY.VL é╔èiö[é│éΩé─éóé▄é╖üBÄ└ì█é╔ô«ì∞é≡èmöFé╡é─
é▌é─é¡é╛é│éóüB
üiédénéeüj